Check Box kontrolü, BUTTON kontrolü altında tanımlanan bir kontroldür. Check Box, kare şeklinde bir kutu ve program içinde tanımlanan bir metin veya küçük bir resimden (icon veya bitmap) oluşur. Check Box, kullanıcının program için gerekli olan belirli seçenekleri tercih edip etmediğini belirlemek için kullanılır.
Check Box kontrolü, CreateWindowEx() fonksiyonunun lpClassName parametresi içinde BUTTON veya WC_BUTTON değeri ile tanımlanan bir kontroldür.
BUTTON değerini kullanırsanız programın başında windows.h başlık dosyasını dahil etmeniz yeterlidir, ancak WC_BUTTON değerini kullanırsanız commctrl.h başlık dosyasını dahil etmeniz gerekir.
Bir Check Box kontrolü, CreateWindowEx() fonksiyonunun dwStyle parametresi içinde tanımlanan, aşağıdaki 4 tipten birine sahiptir:
BS_CHECKBOX : Standart tip
BS_AUTOCHECKBOX : Otomatik tip
BS_3STATE : Üç konumlu tip
BS_AUTO3STATE : Otomatik üç konumlu tip
Her tipin işaretlenmiş (kutu içinde bir check işareti) ve işaretsiz (check işaretsiz) olmak üzere 2 konumu vardır. Üç konumlu olan son iki tip ise ilaveten, kullanıcının bir seçim yapmadığını göstermeye yarayan, belirsiz konum seçeneği (kutu içi boyalı) içermektedir. Standart ve otomatik tiplere peş peşe tıklamak iki konum arasında değişim sağlayarak, check işaretini ekler veya kaldırır. Üç konumlu tiplere peş peşe tıklamak ise check işaretinin olduğu durumdan, belirsiz konuma oradan da check işaretinin kaldırıldığı duruma geçişi sağlar ve döngü bu şekilde tekrar eder.
Kullanıcı bir Check Box'a tıkladığında klavye kontrolü Check Box'a geçer. Sistem ana pencereye BN_CLICKED bildirim kodu içeren bir WM_COMMAND mesajı gönderir. Eğer bu mesaj otomatik veya otomatik üç konumlu bir Check Box'tan gelirse, sistem bu tipler için check konumunu ayarlayacağından, ana pencerenin bu mesaja işlem yapması gerekmez. Eğer mesaj standart veya üç konumlu bir Check Box'tan gelirse, ana pencerenin bu mesaja işlem yapması gerekir. Check Box tipini dikkate almadan, sistem, konumu değiştiğinde, Check Box penceresini yeniden boyar.
Şimdi, programımıza BUTTON kontrol yoluyla Check Box kontrolleri eklemeye çalışalım.
#define IDC_CHECKBOX01 321 /* Check Box için tanımlayıcı makro bildirimi */
#define IDC_CHECKBOX02 322 /* Check Box için tanımlayıcı makro bildirimi */
#define IDC_CHECKBOX03 323 /* Check Box için tanımlayıcı makro bildirimi */
#define IDC_CHECKBOX04 324 /* Check Box için tanımlayıcı makro bildirimi */
/* Check Box kontrolleri için pencere Handle değeri bildirimi */
HWND hwndCheckBox01, hwndCheckBox02, hwndCheckBox03, hwndCheckBox04;
WindowProcedure() fonksiyonu içinde renkli olarak gösterilen satırlar ile her biri ayrı tipte 4 adet Check Box kontrolü oluşturulur. WM_COMMAND mesajına işlem yapılarak Check Box kontrolleri ile ilgili işlemler belirlenir:
LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
UINT ret;
switch (message)
{
case WM_CREATE:
hwndCheckBox01 = CreateWindowEx(0, "BUTTON", "Standart Check Box",
WS_CHILD | WS_VISIBLE | BS_CHECKBOX, 20, 20, 250, 25,
hwnd, (HMENU) IDC_CHECKBOX01, NULL, NULL);
hwndCheckBox02 = CreateWindowEx(0, "BUTTON", "Otomatik Check Box",
WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 20, 60, 250, 25,
hwnd, (HMENU) IDC_CHECKBOX02, NULL, NULL);
hwndCheckBox03 = CreateWindowEx(0, "BUTTON", "Üç konumlu Check Box",
WS_CHILD | WS_VISIBLE | BS_3STATE, 20, 100, 250, 25,
hwnd, (HMENU) IDC_CHECKBOX03, NULL, NULL);
hwndCheckBox04 = CreateWindowEx(0, "BUTTON", "Otomatik üç konumlu Check Box",
WS_CHILD | WS_VISIBLE | BS_AUTO3STATE, 20, 140, 250, 25,
hwnd, (HMENU) IDC_CHECKBOX04, NULL, NULL);
break;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED) {
if (LOWORD(wParam) == IDC_CHECKBOX01) {
CheckDlgButton(hwnd, IDC_CHECKBOX01,
!IsDlgButtonChecked (hwnd, IDC_CHECKBOX01));
}
if (LOWORD(wParam) == IDC_CHECKBOX03) {
ret = IsDlgButtonChecked (hwnd, IDC_CHECKBOX03);
if (ret==BST_CHECKED) {
CheckDlgButton(hwnd, IDC_CHECKBOX03, BST_INDETERMINATE);
}
else if (ret==BST_UNCHECKED) {
CheckDlgButton(hwnd, IDC_CHECKBOX03, BST_CHECKED);
}
else {
CheckDlgButton(hwnd, IDC_CHECKBOX03, BST_UNCHECKED);
}
}
}
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
Check Box kontrol pencereleri oluşturulurken, CreateWindowEx() fonksiyonunun lpClassName parametresi için sistemdeki ön tanımlı değerlerden biri olan BUTTON değeri, dwStyle parametresi için ise sırasıyla BS_CHECKBOX, BS_AUTOCHECKBOX, BS_3STATE ve BS_AUTO3STATE değerleri kullanılır.
Program çalıştığında:
Programın çalışan en son hali aşağıdadır:
#include <windows.h>
#define IDC_CHECKBOX01 321
#define IDC_CHECKBOX02 322
#define IDC_CHECKBOX03 323
#define IDC_CHECKBOX04 324
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
char szClassName[ ] = "WinAPIWindowsApp";
HINSTANCE ghInst;
HWND hwndCheckBox01, hwndCheckBox02, hwndCheckBox03, hwndCheckBox04;
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
HWND hwndMain;
MSG messages;
WNDCLASSEX wincl;
ghInst = hThisInstance;
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
if (!RegisterClassEx (&wincl)) return 0;
hwndMain = CreateWindowEx (0, szClassName, "WinAPI Temel Program", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL,
hThisInstance, NULL);
if (!hwndMain) return 0;
ShowWindow (hwndMain, nCmdShow);
UpdateWindow(hwndMain);
while (GetMessage (&messages, NULL, 0, 0) > 0) {
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return messages.wParam;
}
LRESULT CALLBACK WindowProcedure (HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
UINT ret;
switch (message)
{
case WM_CREATE:
hwndCheckBox01 = CreateWindowEx(0, "BUTTON", "Standart Check Box",
WS_CHILD | WS_VISIBLE | BS_CHECKBOX, 20, 20, 250, 25,
hwnd, (HMENU) IDC_CHECKBOX01, NULL, NULL);
hwndCheckBox02 = CreateWindowEx(0, "BUTTON", "Otomatik Check Box",
WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 20, 60, 250, 25,
hwnd, (HMENU) IDC_CHECKBOX02, NULL, NULL);
hwndCheckBox03 = CreateWindowEx(0, "BUTTON", "Üç konumlu Check Box",
WS_CHILD | WS_VISIBLE | BS_3STATE, 20, 100, 250, 25,
hwnd, (HMENU) IDC_CHECKBOX03, NULL, NULL);
hwndCheckBox04 = CreateWindowEx(0, "BUTTON", "Otomatik üç konumlu Check Box",
WS_CHILD | WS_VISIBLE | BS_AUTO3STATE, 20, 140, 250, 25,
hwnd, (HMENU) IDC_CHECKBOX04, NULL, NULL);
break;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED) {
if (LOWORD(wParam) == IDC_CHECKBOX01) {
CheckDlgButton(hwnd, IDC_CHECKBOX01,
!IsDlgButtonChecked (hwnd, IDC_CHECKBOX01));
}
if (LOWORD(wParam) == IDC_CHECKBOX03) {
ret = IsDlgButtonChecked (hwnd, IDC_CHECKBOX03);
if (ret==BST_CHECKED) {
CheckDlgButton(hwnd, IDC_CHECKBOX03, BST_INDETERMINATE);
}
else if (ret==BST_UNCHECKED) {
CheckDlgButton(hwnd, IDC_CHECKBOX03, BST_CHECKED);
}
else {
CheckDlgButton(hwnd, IDC_CHECKBOX03, BST_UNCHECKED);
}
}
}
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
Program çalıştığında karşınıza gelecek ekran görüntüsü aşağıdadır: